﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Objects;
using System.Linq;

using Microsoft.Practices.Unity;

using Arquitetura.Architectural.Model;
using Arquitetura.Architectural.DataLayer;
using Arquitetura.Model;

namespace Arquitetura.DataLayer
{
    public class PessoaRepository : Repository<ArquiteturaModelContainer>, IPessoaRepository
    {
        #region Propriedade(s)
        protected override string EntitySetName
        {
            get { return "PessoaSet"; }
        }

        private ObjectQuery<Aluno> AlunoSet
        {
            get
            {
                return ObjectQuerySelectFactory<Aluno>();
            }
        }

        private ObjectQuery<Mae> MaeSet
        {
            get
            {
                return ObjectQuerySelectFactory<Mae>();
            }
        }

        private ObjectQuery<Pai> PaiSet
        {
            get
            {
                return ObjectQuerySelectFactory<Pai>();
            }
        }
        #endregion Propriedade(s)

        #region Construtor(es)
        public PessoaRepository()
            : this(new ArquiteturaModelContainer()) { }

        [InjectionConstructor]
        public PessoaRepository(ArquiteturaModelContainer arquiteturaModelContainer)
            : base(arquiteturaModelContainer) { }
        #endregion Construtor(es)

        #region Método(s)
        public Result<IQueryable<Aluno>> Select()
        {
            try
            {
                return new Result<IQueryable<Aluno>>(AlunoSet);
            }
            catch (Exception ex)
            {
                return new Result<IQueryable<Aluno>>(ex);
            }
        }

        public Result<IQueryable<Aluno>> Select(IEnumerable<string> attributosEntidadeIncluidos)
        {
            try
            {
                return new Result<IQueryable<Aluno>>(
                    AlunoSet.Include(attributosEntidadeIncluidos));
            }
            catch (Exception ex)
            {
                return new Result<IQueryable<Aluno>>(ex);
            }
        }

        public Result<IQueryable<Mae>> SelectMae()
        {
            try
            {
                return new Result<IQueryable<Mae>>(MaeSet);
            }
            catch (Exception ex)
            {
                return new Result<IQueryable<Mae>>(ex);
            }
        }

        public Result<IQueryable<Pai>> SelectPai()
        {
            try
            {
                return new Result<IQueryable<Pai>>(PaiSet);
            }
            catch (Exception ex)
            {
                return new Result<IQueryable<Pai>>(ex);
            }
        }

        public Result InsertAluno(Aluno aluno)
        {
            try
            {
                Mae mae = null;
                Pai pai = null;

                if ((aluno.Mae != null) && (aluno.Mae.Id != 0))
                {
                    mae = aluno.Mae;
                    aluno.Mae = null;
                    aluno.MaeReference.EntityKey = CreateEntityKey(mae);
                }

                if ((aluno.Pai != null) && (aluno.Pai.Id != 0))
                {
                    pai = aluno.Pai;
                    aluno.Pai = null;
                    aluno.PaiReference.EntityKey = CreateEntityKey(pai);
                }

                InsertEntity(aluno);

                if (mae != null)
                {
                    aluno.Mae = mae;
                }

                if (pai != null)
                {
                    aluno.Pai = pai;
                }

                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result UpdateAluno(Aluno aluno)
        {
            try
            {
                UpdateEntity(aluno);
                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result DeleteAluno(Aluno aluno)
        {
            try
            {
                DeleteEntity(aluno);
                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }

        }

        public Result InsertMae(Mae mae)
        {
            try
            {
                InsertEntity(mae);
                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result UpdateMae(Mae mae)
        {
            try
            {
                UpdateEntity(mae);
                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result InsertPai(Pai pai)
        {
            try
            {
                InsertEntity(pai);
                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }

        public Result UpdatePai(Pai pai)
        {
            try
            {
                UpdateEntity(pai);
                return new Result(true);
            }
            catch (Exception ex)
            {
                return new Result(ex);
            }
        }
        #endregion Método(s)
    }
}

